
    <!DOCTYPE html>
    <html lang="zh-CN">
    <head>
      <meta charset="UTF-8">
      <meta name="viewport" content="width=device-width, initial-scale=1.0">
      <title>如何在Spring Boot中使用Profiles实现环境隔离 - 学习卡片</title>
      <style>
        body { font-family: sans-serif; background-color: #f0f8ff; color: #333; display: flex; flex-direction: column; align-items: center; padding: 50px 20px; }
        .header h1 { font-size: 32px; }
        .grid-container { display: grid; grid-template-columns: repeat(3, 1fr); gap: 28px; width: 100%; max-width: 1200px; }
        .card-container { perspective: 1200px; cursor: pointer; height: 250px; }
        .card { width: 100%; height: 100%; position: relative; transform-style: preserve-3d; transition: transform 0.7s; border-radius: 16px; box-shadow: 0 4px 16px rgba(0,0,0,0.08); }
        .card-container.flipped .card { transform: rotateY(180deg); }
        .card-face { position: absolute; width: 100%; height: 100%; backface-visibility: hidden; display: flex; flex-direction: column; box-sizing: border-box; border-radius: 16px; background-color: #fff; padding: 24px; }
        .card-back { background-color: #f0fff4; transform: rotateY(180deg); justify-content: space-between; }
        .card-category { font-size: 14px; color: #0052d9; margin-bottom: 8px; font-weight: 500; }
        .card-question { font-size: 20px; font-weight: 500; flex-grow: 1; display: flex; align-items: center; justify-content: center; text-align: center; }
        .card-answer-wrapper { flex-grow: 1; overflow-y: auto; }
        .card-answer { font-size: 15px; line-height: 1.7; }
        .card-footer { font-size: 13px; color: #8a919f; border-top: 1px solid #f0f0f0; padding-top: 16px; margin-top: 16px; }
        .card-source { font-size: 13px; color: #8a919f; border-top: 1px solid #f0f0f0; padding-top: 12px; margin-top: 12px; }
      </style>
    </head>
    <body>
      <div class="header">
        <h1>如何在Spring Boot中使用Profiles实现环境隔离 - 学习卡片</h1>
      </div>
      <div class="grid-container">
        
    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">理论</div>
          <div class="card-question">Spring Profiles 的核心目的是什么？它如何帮助开发者管理应用程序？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">理论</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">Spring Profiles 的核心目的是实现应用程序的环境隔离和配置管理。它允许开发者根据不同的运行环境（如开发、测试、生产）加载不同的配置，从而使应用程序能够灵活调整其行为和配置，将环境相关的配置逻辑从代码中分离出来。</div>
          </div>
          <div class="card-source">来源: 什么是Spring Profiles</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">技术</div>
          <div class="card-question">在Spring Boot中，如何为不同环境（如dev, test, prod）定义独立的配置文件？请说明其命名约定。</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">技术</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">Spring Boot支持使用多个配置文件来管理不同环境的配置。其命名约定为 `application-{profile}.properties` 或 `application-{profile}.yml`，其中 `{profile}` 是具体的环境名。例如，`application-dev.properties`、`application-test.properties` 和 `application-prod.properties` 分别对应开发、测试和生产环境。</div>
          </div>
          <div class="card-source">来源: 2. 配置管理</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">机制</div>
          <div class="card-question">列举三种在 Spring Boot 中激活特定 Profile 的常用方法。</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">机制</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">1. **通过配置文件**：在主配置文件（如 `application.properties`）中设置 `spring.profiles.active=dev`。 2. **通过命令行参数**：在启动应用时使用参数 `--spring.profiles.active=prod`。 3. **通过环境变量**：设置名为 `SPRING_PROFILES_ACTIVE` 的环境变量，例如 `export SPRING_PROFILES_ACTIVE=prod`。</div>
          </div>
          <div class="card-source">来源: 2. 激活Profile的方法</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">特性</div>
          <div class="card-question">@Profile 注解的作用是什么？它通常用在什么地方？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">特性</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">`@Profile` 注解用于实现条件化配置。开发者可以在 Bean 定义上（例如在 `@Component` 或 `@Bean` 注解的类或方法上）使用 `@Profile` 注解，指定该 Bean 仅在特定的 Profile 被激活时才加载到 Spring 容器中。</div>
          </div>
          <div class="card-source">来源: 4. 条件化配置</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">机制</div>
          <div class="card-question">当一个特定环境的 Profile (如 prod)被激活时，其配置文件（`application-prod.properties`）与默认配置文件（`application.properties`）中的属性是如何协同工作的？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">机制</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">这是一种继承和重写的关系。默认配置文件 `application.properties` 作为所有环境的公共配置。当 `prod` Profile 被激活时，`application-prod.properties` 文件中的属性会加载，并且如果存在与 `application.properties` 中同名的属性，则会覆盖默认配置中的值。</div>
          </div>
          <div class="card-source">来源: 5. 默认配置与重写</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">技术</div>
          <div class="card-question">相较于传统的 `.properties` 文件，使用 YAML 格式来组织 Spring Boot 配置有哪些主要优势？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">技术</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">使用 YAML 格式的主要优势有两个：1. **更强的结构化**：YAML 支持更复杂的数据结构和层级关系，表示方式更直观。2. **减少冗余**：YAML 的层次结构可以减少重复的配置前缀，从而增加配置文件的可读性。</div>
          </div>
          <div class="card-source">来源: 4. 使用 YAML 格式</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">机制</div>
          <div class="card-question">如何同时激活多个 Profiles？当不同 Profile 中的配置属性发生冲突时，Spring Boot 如何决定最终使用的值？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">机制</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">可以通过逗号分隔的方式来激活多个 Profiles，例如 `spring.profiles.active=dev,feature-x`。当配置属性发生冲突时，后激活的 Profile 中的配置将覆盖先激活 Profile 中的相同属性。</div>
          </div>
          <div class="card-source">来源: 4. Profile的冲突与解决</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">特性</div>
          <div class="card-question">除了 `@Profile` 注解，文档中还介绍了哪两个基于特定条件的注解来控制Bean的加载？请简要说明其作用。</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">特性</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">文档还介绍了：1. `@ConditionalOnProperty`：根据配置文件中某个属性的值来决定是否加载Bean。例如，当 `feature.enabled` 属性为 `true` 时才加载。 2. `@ConditionalOnClass`：根据Java类路径（classpath）中是否存在某个特定的类来决定是否加载Bean。</div>
          </div>
          <div class="card-source">来源: 2. 条件化配置的实现方式</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">机制</div>
          <div class="card-question">在激活 Profile 时，通过命令行参数指定和在 `application.properties` 文件中指定，这两种方式的优先级是怎样的？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">机制</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">通过命令行参数指定的 Profile 优先级更高。如果同时在配置文件和命令行中都指定了激活的 Profile，那么命令行中的设置将覆盖配置文件中的设置。</div>
          </div>
          <div class="card-source">来源: 3. Profile的优先级</div>
        </div>
      </div>
    </div>

      </div>
    </body>
    </html>
